/**
 * API工具类
 * 统一管理所有API请求
 */

const remoteBaseURL = 'https://xinyadelicacies.com/api/v1'
const localBaseURL = 'http://localhost:3912/api/v1'

// API基础配置
const API_CONFIG = {
  baseURL: remoteBaseURL,  // 生产环境使用HTTPS域名
  timeout: 10000
}

// 导出API基础地址，方便在其他地方复用
export const API_BASE_URL = API_CONFIG.baseURL
export const API_ORIGIN = API_BASE_URL.replace(/\/api\/.*$/, '') || API_BASE_URL

/**
 * 通用请求方法
 * @param {Object} options 请求配置
 * @returns {Promise}
 */
function request(options) {
  return new Promise((resolve, reject) => {
    // 获取token
    const token = uni.getStorageSync('token')

    // 构建请求配置
    const config = {
      url: API_CONFIG.baseURL + options.url,
      method: options.method || 'GET',
      data: options.data || {},
      header: {
        'Content-Type': 'application/json',
        ...options.header
      },
      timeout: options.timeout || API_CONFIG.timeout
    }

    // 添加认证头
    if (token) {
      config.header.Authorization = `Bearer ${token}`
    }

    // 发送请求
    uni.request({
      ...config,
      success: (res) => {
        // 2xx状态码都认为是成功
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data)
        } else if (res.statusCode === 401) {
          // 处理401未授权错误
          console.warn('401 未授权,清除token并跳转登录页')

          // 清除本地token
          uni.removeStorageSync('token')
          uni.removeStorageSync('userInfo')

          // 显示提示
          uni.showToast({
            title: '登录已过期,请重新登录',
            icon: 'none',
            duration: 2000
          })

          // 跳转到登录页(延迟执行以确保toast显示)
          setTimeout(() => {
            uni.reLaunch({
              url: '/pages/login/login'
            })
          }, 2000)

          // 拒绝Promise
          reject(new Error(`HTTP ${res.statusCode}: ${res.data?.message || '访问令牌已过期,请重新登录'}`))
        } else {
          // 处理其他HTTP错误
          reject(new Error(`HTTP ${res.statusCode}: ${res.data?.message || '请求失败'}`))
        }
      },
      fail: (err) => {
        console.error('请求失败:', err)
        reject(new Error('网络请求失败'))
      }
    })
  })
}

/**
 * 工具方法
 */
export const utils = {
  /**
   * 处理API错误
   * @param {Error} error 错误对象
   * @param {string} defaultMessage 默认错误消息
   */
  handleError(error, defaultMessage = '操作失败') {
    console.error('API错误:', error)

    let message = defaultMessage
    if (error.message) {
      message = error.message
    }

    uni.showToast({
      title: message,
      icon: 'none',
      duration: 2000
    })
  }
}

/**
 * 认证API
 */
export const authAPI = {
  /**
   * 小程序登录
   * @param {Object} data { code, nickname, avatarUrl }
   */
  miniprogramLogin(data) {
    return request({
      url: '/auth/miniprogram/login',
      method: 'POST',
      data
    })
  },

  /**
   * 获取当前用户信息
   */
  getCurrentUser() {
    return request({
      url: '/auth/me',
      method: 'GET'
    })
  }
}

/**
 * 地点API
 */
export const locationAPI = {
  /**
   * 获取地点列表
   * @param {Object} params { status, page, limit }
   */
  getLocations(params) {
    return request({
      url: '/locations',
      method: 'GET',
      data: params
    })
  },

  /**
   * 获取地点详情
   * @param {Number} id 地点ID
   */
  getLocationById(id) {
    return request({
      url: `/locations/${id}`,
      method: 'GET'
    })
  },

  /**
   * 创建地点
   * @param {Object} data { name, coordinateX, coordinateY }
   */
  createLocation(data) {
    return request({
      url: '/locations',
      method: 'POST',
      data
    })
  },

  /**
   * 获取地点的推荐菜品
   * @param {Number} locationId 地点ID
   */
  getLocationDishes(locationId) {
    return request({
      url: `/locations/${locationId}/dishes`,
      method: 'GET'
    })
  },

  /**
   * 添加推荐菜品
   * @param {Number} locationId 地点ID
   * @param {Object} data { dishName, floor, price }
   */
  addRecommendedDish(locationId, data) {
    return request({
      url: `/locations/${locationId}/dishes`,
      method: 'POST',
      data
    })
  },

  /**
   * 获取地点的拥挤程度
   * @param {Number} locationId 地点ID
   */
  getLocationCongestion(locationId) {
    return request({
      url: `/locations/${locationId}/congestion`,
      method: 'GET'
    })
  }
}

/**
 * 评分API
 */
export const ratingAPI = {
  /**
   * 为地点评分
   * @param {Number} locationId 地点ID
   * @param {Object} data { score }
   */
  rateLocation(locationId, data) {
    return request({
      url: `/locations/${locationId}/ratings`,
      method: 'POST',
      data
    })
  },

  /**
   * 获取我对该地点的评分
   * @param {Number} locationId 地点ID
   */
  getMyRating(locationId) {
    return request({
      url: `/locations/${locationId}/ratings/my`,
      method: 'GET'
    })
  },

  /**
   * 删除我的评分
   * @param {Number} locationId 地点ID
   */
  deleteRating(locationId) {
    return request({
      url: `/locations/${locationId}/ratings`,
      method: 'DELETE'
    })
  }
}

export { request }
